#ifndef NETWORKMANAGER_H
#define NETWORKMANAGER_H

#include <QObject>
#include <QTcpSocket>
#include <QDataStream>
#include <QFile>
#include <QTimer>
#include <QFileInfo>

class NetworkManager : public QObject
{
    Q_OBJECT

public:
    explicit NetworkManager(QObject* parent = nullptr);
    ~NetworkManager();

    // 连接服务器
    void connectToServer(const QString& host, quint16 port);
    void disconnectFromServer();

    // 用户认证
    void registerAccount(const QString& username, const QString& password);
    void login(const QString& username, const QString& password);

    // 聊天功能
    void sendChatMessage(const QString& target, const QString& message);
    void sendFile(const QString& target, const QString& filePath);
    void requestFile(const QString& fileName);

    // 好友系统
    void addFriend(const QString& friendName);
    void respondFriendRequest(const QString& friendName, bool accept);

    bool isConnected() const;

signals:
    // 连接状态
    void connected();
    void disconnected();
    void connectionError(const QString& error);

    // 认证结果
    void registerResult(bool success, const QString& message);
    void loginResult(bool success, const QString& message);

    // 消息接收
    void chatMessageReceived(const QString& from, const QString& message);
    void fileReceived(const QString& fileName, const QByteArray& data);
    void fileTransferProgress(qint64 bytesSent, qint64 bytesTotal);

    // 好友系统
    void friendRequestReceived(const QString& friendName);
    void friendRequestResult(bool success, const QString& message);

private slots:
    void onConnected();
    void onDisconnected();
    void onReadyRead();
    void onErrorOccurred(QAbstractSocket::SocketError error);

private:
    // 数据包处理
    void sendPacket(uint32_t type, const QByteArray& data);
    void processPacket(uint32_t type, const QByteArray& data);

    // 数据包解析
    void handleLoginResponse(const QByteArray& data);
    void handleRegisterResponse(const QByteArray& data);
    void handleChatMessage(const QByteArray& data);
    void handleFileData(const QByteArray& data);
    void handleFriendRequest(const QByteArray& data);

    QTcpSocket* m_socket;
    QByteArray m_buffer;
    qint32 m_packetSize;
    bool m_connected;
};

#endif // NETWORKMANAGER_H

